package com.alg.pattern.facade;

/**
 * 外观模式(Facade Pattern)：外部与一个子系统的通信必须通过一个统一的外观对象进行，
 * 为子系统中的一组接口提供一个一致的界面，外观模式定义了一个高层接口，这个接口使得
 * 这一子系统更加容易使用。外观模式又称为门面模式，它是一种对象结构型模式。
 * @ClassName GeneralSwitchFacade
 * @Author Jiayi Zheng
 * @Date 2022/12/30 14:10
 * @Description: todo
 * @Version V1.0
 */

//外观角色类
public class GeneralSwitchFacade {
    private Light lights[]=new Light[4];
    private Fan fan;
    private AirConditioner ac;
    private Television tv;

    public GeneralSwitchFacade()
    {
        lights[0]=new Light("左前");
        lights[1]=new Light("右前");
        lights[2]=new Light("左后");
        lights[3]=new Light("右后");
        fan=new Fan();
        ac=new AirConditioner();
        tv=new Television();
    }

    public void on()
    {
        lights[0].on();
        lights[1].on();
        lights[2].on();
        lights[3].on();
        fan.on();
        ac.on();
        tv.on();
    }

    public void off()
    {
        lights[0].off();
        lights[1].off();
        lights[2].off();
        lights[3].off();
        fan.off();
        ac.off();
        tv.off();
    }
}

//子系统角色类
 class Light
{
    private String position;

    public Light(String position)
    {
        this.position=position;
    }

    public void on()
    {
        System.out.println(this.position + "灯打开！");
    }

    public void off()
    {
        System.out.println(this.position + "灯关闭！");
    }
}

//子系统角色
 class Fan
{
    public void on()
    {
        System.out.println("风扇打开！");
    }

    public void off()
    {
        System.out.println("风扇关闭！");
    }
}

//子系统角色
 class AirConditioner
{
    public void on()
    {
        System.out.println("空调打开！");
    }

    public void off()
    {
        System.out.println("空调关闭！");
    }
}

//子系统角色
 class Television
{
    public void on()
    {
        System.out.println("电视机打开！");
    }

    public void off()
    {
        System.out.println("电视机关闭！");
    }
}

//客户端
 class Client
{
    public static void main(String args[])
    {
        GeneralSwitchFacade gsf=new GeneralSwitchFacade();
        gsf.on();
        System.out.println("-----------------------");
        gsf.off();
    }
}
